package handler

import (
	"blog_go/internal/model"
	"blog_go/internal/service"
	"blog_go/pkg/helper/resp"
	"net/http"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

type TagHandler interface {
	QueryTag(ctx *gin.Context)
	QueryAllTag(ctx *gin.Context)
	AddTag(ctx *gin.Context)
	UpdateTag(ctx *gin.Context)
	DelTag(ctx *gin.Context)
}

type tagHandler struct {
	*Handler
	tagService service.TagService
}

func NewTagHandler(handler *Handler, tagService service.TagService) TagHandler {
	return &tagHandler{
		Handler:    handler,
		tagService: tagService,
	}
}

// 查询分类下的标签
func (h *tagHandler) QueryTag(ctx *gin.Context) {
	var params struct {
		CategoryId int `form:"categoryId" required:"true"`
	}

	if err := ctx.ShouldBind(&params); err != nil {
		h.logger.Warn("QueryTag", zap.Any("error", err))
		resp.HandleError(ctx, http.StatusBadRequest, 1, err.Error(), nil)
		return
	}

	h.logger.Info("QueryTag attempted", zap.Any("categoryId", params.CategoryId))

	data, err := h.tagService.QueryTag(params.CategoryId)

	if err != nil {
		h.logger.Error("QueryTag failed", zap.Any("categoryId", params.CategoryId), zap.Any("error", err))
		resp.HandleError(ctx, http.StatusInternalServerError, 1, err.Error(), nil)
		return
	}

	resp.HandleSuccess(ctx, data)
}

// 查询所有标签
func (h *tagHandler) QueryAllTag(ctx *gin.Context) {

	data, err := h.tagService.QueryAllTag()

	if err != nil {
		h.logger.Error("QueryAllTag failed", zap.Any("error", err))
		resp.HandleError(ctx, http.StatusInternalServerError, 1, err.Error(), nil)
		return
	}

	resp.HandleSuccess(ctx, data)
}

// 新增标签
func (h *tagHandler) AddTag(ctx *gin.Context) {
	var tag model.TagView

	if err := ctx.ShouldBind(&tag); err != nil {
		h.logger.Warn("AddTag", zap.Any("error", err))
		resp.HandleError(ctx, http.StatusBadRequest, 1, err.Error(), nil)
		return
	}

	h.logger.Info("AddTag attempted", zap.Any("categoryId", tag.CategoryId), zap.Any("tagName", tag.TagName))

	err := h.tagService.AddTag(tag)

	if err != nil {
		h.logger.Error("AddTag failed", zap.Any("categoryId", tag.CategoryId), zap.Any("tagName", tag.TagName), zap.Any("error", err))
		resp.HandleError(ctx, http.StatusInternalServerError, 1, err.Error(), nil)
		return
	}

	resp.HandleSuccess(ctx, nil)
}

// 编辑标签
func (h *tagHandler) UpdateTag(ctx *gin.Context) {
	var tag model.TagView

	if err := ctx.ShouldBind(&tag); err != nil {
		h.logger.Warn("UpdateTag", zap.Any("error", err))
		resp.HandleError(ctx, http.StatusBadRequest, 1, err.Error(), nil)
		return
	}

	h.logger.Info("UpdateTag attempted", zap.Any("tagId", tag.TagId))

	err := h.tagService.UpdateTag(tag)

	if err != nil {
		h.logger.Error("UpdateTag failed", zap.Any("categoryId", tag.CategoryId), zap.Any("tagId", tag.TagId), zap.Any("error", err))
		resp.HandleError(ctx, http.StatusInternalServerError, 1, err.Error(), nil)
		return
	}

	resp.HandleSuccess(ctx, nil)
}

//删除标签

func (h *tagHandler) DelTag(ctx *gin.Context) {
	var params struct {
		TagId int `json:"tagId" binding:"required"`
	}

	if err := ctx.ShouldBind(&params); err != nil {
		h.logger.Warn("DelTag", zap.Any("error", err))
		resp.HandleError(ctx, http.StatusBadRequest, 1, err.Error(), nil)
		return
	}

	h.logger.Info("DelTag attempted", zap.Any("tagId", params.TagId))

	err := h.tagService.DelTag(params.TagId)

	if err != nil {
		h.logger.Error("DelTag failed", zap.Any("tagId", params.TagId), zap.Any("error", err))
		resp.HandleError(ctx, http.StatusInternalServerError, 1, err.Error(), nil)
		return
	}

	resp.HandleSuccess(ctx, nil)
}
